{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c35e8602",
   "metadata": {},
   "source": [
    "# This is another example of using featurewiz to perform feature selection in a multi-label (multi-target) regression dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8c2b241a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Imported 0.2.8 version. Select nrows to a small number when running on huge datasets.\n",
      "output = featurewiz(dataname, target, corr_limit=0.90, verbose=2, sep=',', \n",
      "\t\theader=0, test_data='',feature_engg='', category_encoders='',\n",
      "\t\tdask_xgboost_flag=False, nrows=None, skip_sulov=False)\n",
      "Create new features via 'feature_engg' flag : ['interactions','groupby','target']\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import r2_score\n",
    "import featurewiz as fw"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5c87f634",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>X1</th>\n",
       "      <th>X2</th>\n",
       "      <th>X3</th>\n",
       "      <th>X4</th>\n",
       "      <th>X5</th>\n",
       "      <th>X6</th>\n",
       "      <th>X7</th>\n",
       "      <th>X8</th>\n",
       "      <th>Y1</th>\n",
       "      <th>Y2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.98</td>\n",
       "      <td>514.5</td>\n",
       "      <td>294.0</td>\n",
       "      <td>110.25</td>\n",
       "      <td>7.0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>15.55</td>\n",
       "      <td>21.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.98</td>\n",
       "      <td>514.5</td>\n",
       "      <td>294.0</td>\n",
       "      <td>110.25</td>\n",
       "      <td>7.0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>15.55</td>\n",
       "      <td>21.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.98</td>\n",
       "      <td>514.5</td>\n",
       "      <td>294.0</td>\n",
       "      <td>110.25</td>\n",
       "      <td>7.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>15.55</td>\n",
       "      <td>21.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.98</td>\n",
       "      <td>514.5</td>\n",
       "      <td>294.0</td>\n",
       "      <td>110.25</td>\n",
       "      <td>7.0</td>\n",
       "      <td>5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>15.55</td>\n",
       "      <td>21.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.90</td>\n",
       "      <td>563.5</td>\n",
       "      <td>318.5</td>\n",
       "      <td>122.50</td>\n",
       "      <td>7.0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>20.84</td>\n",
       "      <td>28.28</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     X1     X2     X3      X4   X5  X6   X7  X8     Y1     Y2\n",
       "0  0.98  514.5  294.0  110.25  7.0   2  0.0   0  15.55  21.33\n",
       "1  0.98  514.5  294.0  110.25  7.0   3  0.0   0  15.55  21.33\n",
       "2  0.98  514.5  294.0  110.25  7.0   4  0.0   0  15.55  21.33\n",
       "3  0.98  514.5  294.0  110.25  7.0   5  0.0   0  15.55  21.33\n",
       "4  0.90  563.5  318.5  122.50  7.0   2  0.0   0  20.84  28.28"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# load the dataset\n",
    "data = pd.read_excel('https://archive.ics.uci.edu/ml/machine-learning-databases/00242/ENB2012_data.xlsx')\n",
    "data.columns = ['X' + str(i) for i in range(1, 9)] + ['Y1', 'Y2']\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e6615263",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((614, 8), (154, 8))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Next, I’ll split the dataset into train and test sets:\n",
    "\n",
    "# split the dataset into train and test sets\n",
    "X = data.drop(['Y1', 'Y2'], axis=1)\n",
    "y = data[['Y1', 'Y2']]\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "X_train.shape, X_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "25adec53",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R-square score before feature selection: 0.9027043809921144\n"
     ]
    }
   ],
   "source": [
    "#Then, I’ll fit a linear regression model on the original train set and evaluate its performance on the test set:\n",
    "\n",
    "# fit a linear regression model on the original train set\n",
    "model = LinearRegression()\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# evaluate the model on the test set\n",
    "y_pred = model.predict(X_test)\n",
    "r2_score_before = r2_score(y_test, y_pred)\n",
    "print('R-square score before feature selection:', r2_score_before)\n",
    "\n",
    "#R-square score before feature selection: 0.9027043809921144"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "9e6c628c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "############################################################################################\n",
      "############       F A S T   F E A T U R E  E N G G    A N D    S E L E C T I O N ! ########\n",
      "# Be judicious with featurewiz. Don't use it to create too many un-interpretable features! #\n",
      "############################################################################################\n",
      "featurewiz has selected 0.7 as the correlation limit. Change this limit to fit your needs...\n",
      "Skipping feature engineering since no feature_engg input...\n",
      "Skipping category encoding since no category encoders specified in input...\n",
      "#### Multi_Label Regression problem ####\n",
      "    Loaded train data. Shape = (614, 10)\n",
      "#### Multi_Label Regression problem ####\n",
      "No test data filename given...\n",
      "#######################################################################################\n",
      "######################## C L A S S I F Y I N G  V A R I A B L E S  ####################\n",
      "#######################################################################################\n",
      "        No variables were removed since no ID or low-information variables found in data set\n",
      "No GPU active on this device\n",
      "    Tuning XGBoost using CPU hyper-parameters. This will take time...\n",
      "Turning off Target encoding for multi-label problems like this data set...\n",
      "    since Feature Engineering module cannot handle Multi Label Targets, turnoff target_enc_cat_features to False\n",
      "    After removing redundant variables from further processing, features left = 8\n",
      "No interactions created for categorical vars since feature engg does not specify it\n",
      "#######################################################################################\n",
      "#####  Searching for Uncorrelated List Of Variables (SULOV) in 8 features ############\n",
      "#######################################################################################\n",
      "    there are no null values in dataset...\n",
      "    SelectKBest() function is erroring. Returning with all 8 variables...\n",
      "Time taken for SULOV method = 0 seconds\n",
      "    Adding 0 categorical variables to reduced numeric variables  of 8\n",
      "Final list of selected 8 vars after SULOV = ['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8']\n",
      "Converting all features to numeric before sending to XGBoost...\n",
      "#######################################################################################\n",
      "#####    R E C U R S I V E   X G B O O S T : F E A T U R E   S E L E C T I O N  #######\n",
      "#######################################################################################\n",
      "    using regular XGBoost\n",
      "Current number of predictors before recursive XGBoost = 8 \n",
      "    Taking top 2 features per iteration...\n",
      "    XGBoost version using 1.5.2 as tree method: hist\n",
      "Number of booster rounds = 100\n",
      "        using 8 variables...\n",
      "            Selecting 2 features from this iteration...\n",
      "                Caution: they might be low-quality features since their F-score is less than 1...\n",
      "            Time taken for regular XGBoost feature selection = 0 seconds\n",
      "        using 6 variables...\n",
      "            Selecting 2 features from this iteration...\n",
      "                Caution: they might be low-quality features since their F-score is less than 1...\n",
      "            Time taken for regular XGBoost feature selection = 0 seconds\n",
      "        using 4 variables...\n",
      "            Selecting 2 features from this iteration...\n",
      "                Caution: they might be low-quality features since their F-score is less than 1...\n",
      "            Time taken for regular XGBoost feature selection = 0 seconds\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    Completed XGBoost feature selection in 1 seconds\n",
      "#######################################################################################\n",
      "#####          F E A T U R E   S E L E C T I O N   C O M P L E T E D            #######\n",
      "#######################################################################################\n",
      "Selected 5 important features:\n",
      "['X1', 'X7', 'X4', 'X3', 'X5']\n",
      "Total Time taken for featurewiz selection = 2 seconds\n",
      "Output contains a list of 5 important features and a train dataframe\n",
      "Selected features: ['X1', 'X7', 'X4', 'X3', 'X5']\n"
     ]
    }
   ],
   "source": [
    "#Now, I’ll use featurewiz to select the best features from the train set using a single line of code:\n",
    "\n",
    "# use featurewiz to select the best features from the train set\n",
    "selected_features, _ = fw.featurewiz(X_train.join(y_train),target=['Y1', 'Y2'], corr_limit=0.7, verbose=2)\n",
    "print('Selected features:', selected_features)\n",
    "\n",
    "#Selected features: ['X1', 'X7', 'X4', 'X3', 'X5']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "15abed22",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R-square score after feature selection: 0.9020667726667948\n"
     ]
    }
   ],
   "source": [
    "#Finally, I’ll fit another linear regression model on the selected features of the train set and evaluate its performance on the test set:\n",
    "\n",
    "# fit another linear regression model on the selected features of the train set\n",
    "model2 = LinearRegression()\n",
    "model2.fit(X_train[selected_features], y_train)\n",
    "\n",
    "# evaluate the model on the test set\n",
    "y_pred2 = model2.predict(X_test[selected_features])\n",
    "r2_score_after = r2_score(y_test, y_pred2)\n",
    "print('R-square score after feature selection:', r2_score_after)\n",
    "\n",
    "#R-square score after feature selection: 0.9020667726667948"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af94d9dc",
   "metadata": {},
   "source": [
    "# In this very small features dataset, featurewiz was able to reduce the number of features by 38% yet maintain the same R_Square. This shows the power of good feature selection."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aac70207",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
